AlteryxのRツールで入力を受け取る際にデータを小分けにする
こんにちは、小澤です。
本日はAlteryxのRツールの話です!! Rツールを使ってて、処理をするのにデータ全体が必要ってわけじゃないけど、 メモリを大量消費する処理だから一度に大量のデータを受け取ると処理が失敗するかもしれない、 という場面で活躍する機能を紹介します。
Rツールでは一度に受け取るデータ件数を指定可能
Rツールでは、一度に受け取るデータ件数を指定する機能があります。 この仕組みを使えって例えば100件とすれば、入力が1000件あろうが100万件あろうが10億件あろうが、 先頭から100件までしか取得しません。
そうはいっても10億件全部処理対象なんだけど... となると思われます。 この仕組みでは、残ったたデータのうち次の100件を取得ということが可能ですので、 全てのデータに対して処理を行うことが可能になっています。
なお、データがメモリ上に残り続けれか不要になった際に削除されるかは、 処理の記述の仕方に依存しますので、その点はご注意ください。
さて、実際のやり方ですが最初に以下のように取得します。
data <- read.Alteryx.First("#1", 100, mode="data.frame")
通常利用する read.Alteryx
ではなく、 read.Alteryx.First
という関数を利用しています。
この関数には以下の3つの引数を指定しています。
引数名 | 指定している値 | 説明 |
---|---|---|
name | #1 | データ取得元のコネクション名 |
nRecordLimit | 100 | 一度に取得するデータ件数 |
mode | data.frame | 取得するときの型をdata.frameかlistで指定する |
なお、read.Alteryx
関数同様、mode引数に関してはOptionalとなっており、デフォルトはdata.frameです。
関数名に"First"と入っていることからもわかる通りnRecordLimitで指定した行数分、 先頭からデータを取得します。
続いて、それ以降のデータを取得する方法も確認しましょう。
こちらは read.Alteryx.Next
関数を利用します。
read.Alteryx.Next("#1", mode="data.frame")
引数は read.Alteryx
関数と同じです。
こちらにはnRecordLimit引数はありません。 read.Alteryx.First
で指定した値と同じ行数のデータを取得します。
read.Alteryx.Next
関数は呼び出すたびに前回取得分から次のnRecordLimitで指定した件数のデータを取得します。
例えばデータが315行であれば、
read.Alteryx.First
で最初の100行を取得read.Alteryx.Next
で次の100行を取得read.Alteryx.Next
でその次の100行を取得read.Alteryx.Next
で最後の15行を取得read.Alteryx.Next
を実行しても取得するデータが無いのでNULLが返ってくる
とすることで、すべてのデータを取得できます。
上記の流れの通り、データ件数がnRecordLimitで割り切れない時はさいぎょに取得される件数は剰余となります。
また、もうこれ以上取得するデータが存在しない時に read.Alteryx.Next
関数を呼び出すとNULLが返ってくるため、以下のようにループさせることですべてのデータに対する処理が行えます。
while (!is.null(data)) { data <- read.Alteryx.Next("#1", mode="data.frame") # 取得したデータに対する処理 }
出力はどうするか?
read.Alteryx.First
と read.Alteryx.Next
関数を利用することで、すべてのデータを丸ごと取得せずに処理を行う方法はわかったかと思います。
ここで問題となるのは出力はどうするかです。 せっかく入力を分割して取得しているのに、出力のためにすべてのデータを内部で保持する必要があればこの機能自体いらなくね?となってしまいます。
実はこちらは特別な関数などを用意する必要はありません。
write.Alteryx
関数は同じ出力先を複数回指定して処理を行うとそれらがUnion結合された結果が最終出力となります。
そのため、取得したデータ対して処理を行ったのち、毎回 write.Alteryx
関数を呼び出してしまえばいい、ということになるため以下のような記述が可能です。
read.Alteryx.Next("#1", mode="data.frame") result <- ... # 取得したデータに対する処理 write.Alteryx(result, 1) while (!is.null(data)) { data <- read.Alteryx.Next("#1", mode="data.frame") result <- ... # 取得したデータに対する処理 write.Alteryx(result, 1) }
なお、同じコネクションに対して複数回出力を行う場合、すべてのメタデータが同じになっている必要がありますので、その点はご注意ください。
おわりに
今回は、AlteryxのRツールで一度に受け取るデータ件数を制限する方法を紹介しました。
Rツール使ってるけどデータ件数が多すぎて... とお困りの方はぜひお試しください。
Alteryxの導入なら、クラスメソッドにおまかせください
日本初のAlteryxビジネスパートナーであるクラスメソッドが、Alteryxの導入から活用方法までサポートします。14日間の無料トライアルも実施中ですので、お気軽にご相談ください。